@file:Suppress("unused")

package com.virtualightning.mvvm.base

import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import retrofit2.Retrofit

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/01/27 22:20:18
 *  Project : zxs-new
 *  Http 管理器
 */
abstract class BaseHttpManager {
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/27 11:06 PM
    // 内部 Retrofit 对象
    ///////////////////////////////////////////////////////////////////////////
    private val retrofit: Retrofit by lazy {
        val builder = Retrofit.Builder()
        configRetrofitBuilder(builder)
        addCoroutine(builder)
        builder.build()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/6 上午10:48
    // Api 存储Map
    ///////////////////////////////////////////////////////////////////////////
    private val apiMap = HashMap<Class<*>, Any>()

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/11/12 11:04 上午
    // 添加协程处理
    ///////////////////////////////////////////////////////////////////////////
    protected open fun addCoroutine(builder: Retrofit.Builder) {
        builder.addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/27 11:06 PM
    // Retrofit 构造器
    ///////////////////////////////////////////////////////////////////////////
    protected abstract fun configRetrofitBuilder(builder: Retrofit.Builder)

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/27 11:13 PM
    // 生成指定的 Api
    ///////////////////////////////////////////////////////////////////////////
    fun <T> getApi(apiCls: Class<T>) : T {
        return apiCls.cast(apiMap[apiCls])
            ?: synchronized(this) {
                val doubleCheckObj = apiCls.cast(apiMap[apiCls])
                if(doubleCheckObj != null) {
                    return doubleCheckObj
                }
                val existApiObj = retrofit.create(apiCls)
                apiMap[apiCls] = existApiObj as Any
                return existApiObj
            }
        
    }
}